home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 21 / AACD 21.iso / AACD / Games / JST / sources / src / loaders / SlamTilt / SlamTiltHD.asm < prev   
Encoding:
Assembly Source File  |  2001-03-19  |  4.4 KB  |  305 lines

  1. ; *** Written by Jean-François Fabre 1999-2000
  2.  
  3. ; patches to the main file:
  4. ;
  5. ; 102800266B00FFEA13C0
  6. ;  "" ""  4E75  "" "" (floppy check)
  7. ;
  8. ; 4E7A0801
  9. ; 70004E71 (VBR)
  10. ;
  11.  
  12.     include    "syslibs.i"
  13.     include    "jst.i"
  14.  
  15.     HD_PARAMS    "",0,0
  16.  
  17. MEM_SIZE = $200000
  18.  
  19. loader:
  20.     move.l    #$100000,D0
  21.     JSRABS    AllocExtMem
  22.     
  23.     ; don't care about success or failure of fastmem allocation
  24.  
  25.     Mac_printf    "SlamTilt HD Loader V2.0"
  26.     Mac_printf    "Coded by Jean-François Fabre © 2000"
  27.  
  28.     JSRGEN    GetAttnFlags
  29.     btst    #AFB_68020,D0
  30.     beq    AgaErr
  31.  
  32.     JSRGEN   CheckAGA
  33.     tst.l D0
  34.     bne   AgaErr
  35.  
  36.     JSRABS    UseHarryOSEmu
  37.  
  38.     TESTFILE    MAINFILE
  39.     tst.l    d0
  40.     bne    FileErr
  41.  
  42.     move.l    #130000,D0
  43.     JSRABS    LoadSmallFiles
  44.  
  45.     moveq.l    #0,D0
  46.     move.l    #CACRF_CopyBack,D1
  47.     JSRABS    Degrade
  48.  
  49.     GO_SUPERVISOR
  50.     SAVE_OSDATA    MEM_SIZE,#$5D
  51.  
  52.     ; dos library patch
  53.  
  54.     MOVE.L    $4.W,A6            ;OPEN DOSLIB FOR USE (THE EMU
  55.     MOVEQ.L    #0,D0            ;PROVIDES THE FUNCTIONS)
  56.     LEA    DOSNAM(PC),A1
  57.     JSRLIB    OpenLibrary(A6)
  58.     RELOC_MOVEL    D0,DOSP
  59.  
  60.     ; Lock() function patch
  61.     
  62.     move.l    DOSP(pc),A1
  63.     move.l    #_LVOLock,A0
  64.     GETUSRADDR    mylock
  65.     JSRLIB    SetFunction
  66.     RELOC_MOVEL    D0,OriginalLock
  67.  
  68.     ; RunCommand() patch to patch intro.bin
  69.     ; file on the fly
  70.     ; (avoids access faults)
  71.  
  72.     move.l    DOSP(pc),A1
  73.     move.l    #_LVORunCommand,A0
  74.     GETUSRADDR    myruncommand
  75.     JSRLIB    SetFunction
  76.     RELOC_MOVEL    D0,OriginalRunCommand
  77.  
  78.     move.l    DOSP(pc),A6
  79.     LEA.L    MAINFILE(PC),A0        ;LOAD MAIN GAME
  80.     MOVE.L    A0,D1
  81.     JSRLIB    LoadSeg
  82.                     ;NO NEED TO STORE POINTER FOR LATER USE
  83.     LSL.L    #2,D0
  84.     MOVE.L    D0,A1
  85.     ADDQ.L    #4,A1
  86.  
  87.     cmp.l    #0,A1
  88.     beq    LoadsegErr
  89.  
  90.     lea    linefeed(pc),A0
  91.     MOVEQ.L    #1,D0        ; no pointer on argumentline
  92.  
  93.     bsr    PatchExe
  94.     
  95.     jsr    (A1)
  96.  
  97.     ; end of program
  98.  
  99. LoadsegErr
  100.     JSRGEN    InGameExit
  101.     bra.b    LoadsegErr
  102.  
  103. PatchExe:
  104.     STORE_REGS
  105.     move.l    A1,A3
  106.  
  107.     move.l    A3,A0
  108.     move.l    A0,A1
  109.     add.l    #150000,A1
  110.     lea    .floppycheck(pc),A2
  111.     move.l    #10,D0
  112.     JSRGEN    HexSearch
  113.     cmp.l    #0,A0
  114.     beq.b    .next
  115.     PATCH_RTS    (4,A0)
  116. .next
  117.     move.l    A3,A0
  118.     move.l    A0,A1
  119.     add.l    #150000,A1
  120.     lea    .vbrshit(pc),A2
  121.     move.l    #4,D0
  122.     JSRGEN    HexSearch
  123.     cmp.l    #0,A0
  124.     beq.b    .next2
  125.     move.l    #$70004E71,(A0)
  126. .next2
  127.     move.l    A3,A0
  128.     move.l    A0,A1
  129.     add.l    #150000,A1
  130.     lea    .stcdecrunch(pc),A2
  131.     move.l    #8,D0
  132.     JSRGEN    HexSearch
  133.     cmp.l    #0,A0
  134.     beq.b    .next3
  135.     PATCHUSRJSR    (A0),StartSTC
  136.     PATCH_NOP    (6,A0)
  137. .next3
  138.  
  139.     JSRGEN    FlushCachesHard
  140.     RESTORE_REGS
  141.     rts
  142.  
  143. .stcdecrunch:
  144.     dc.l    $50492A48,$D1D9D3D1
  145.  
  146. .vbrshit:
  147.     dc.l    $4E7A0801
  148. .floppycheck:
  149.     dc.l    $10280026,$6B00FFEA
  150.     dc.w    $13C0
  151.  
  152. FileErr:
  153.     Mac_printf    "File ",f
  154.     lea    MAINFILE(pc),A1
  155.     JSRABS    Display
  156.     Mac_printf     " missing!"
  157.     JSRABS    CloseAll
  158.  
  159. myruncommand:
  160.     STORE_REGS
  161.     LSL.L    #2,D1
  162.     MOVE.L    D1,A1
  163.     ADDQ.L    #4,A1
  164.  
  165.     move.l    A1,A0
  166.     add.l    #28700,A1
  167.     lea    .intropatch(pc),A2
  168.     moveq.l    #6,D0
  169.     JSRGEN    HexSearch
  170.     cmp.l    #0,A0
  171.     beq.b    .exit
  172.  
  173.     move.w    #$6002,(4,A0)
  174.     JSRGEN    FlushCachesHard
  175. .exit
  176.     RESTORE_REGS
  177.  
  178.     move.l    OriginalRunCommand(pc),-(A7)
  179.     RTS    ; executes the program
  180.  
  181. .intropatch:
  182.     dc.w    $1001
  183.     dc.l    $484116F4
  184.  
  185. mylock:
  186.     lea    dfxname(pc),A0
  187.     move.b    #'0',(2,A0)
  188. .loop
  189.     move.l    A0,D0
  190.     JSRGEN    StrcmpAsm
  191.     tst.l    D0
  192.     beq.b    .dfx
  193.     add.b    #1,(2,A0)
  194.     cmp.b    #'4',(2,A0)
  195.     bne.b    .loop
  196.  
  197.     lea    hdname(pc),A0
  198.     move.l    A0,D0
  199.     JSRGEN    StrcmpAsm
  200.     tst.l    D0
  201.     beq.b    .hd
  202.  
  203. .orglock    
  204.     move.l    OriginalLock(pc),-(A7)
  205.     rts
  206.  
  207. .hd:
  208.     moveq.l    #1,D0    ; success: filesize is 0, but WHDLoad interface does not support it!!
  209.     rts
  210.  
  211. .dfx:
  212.     moveq.l    #0,D0    ; failure
  213.     rts
  214.  
  215. ; start of StoneCracker decruncher
  216. ; we call the decrunching code, and then try to patch it
  217. ; (horror level has got some access faults)
  218.  
  219. StartSTC:
  220.     ; gets return address
  221.  
  222.     move.l    (A7)+,A5
  223.     pea    .after_decrunch(pc)
  224.     move.l    A5,-(A7)
  225.  
  226.     ; start of STC code
  227.  
  228.     addq.w    #8,A1
  229.  
  230.     RELOC_MOVEL    (A1),.decrunched_len
  231.  
  232.     move.l    A0,A5
  233.     add.l    (A1)+,A0
  234.     add.l    (A1),A1
  235.  
  236.     rts
  237. .after_decrunch
  238.     STORE_REGS
  239.     move.l    .decrunched_len(pc),D1
  240.     cmp.l    #$A89D4,D1
  241.     bne.b    .notlev4
  242.  
  243.     ; we recognized "demon.bin" file
  244.     
  245.     add.l    #$A0000,A0
  246.     move.l    A0,A1
  247.     add.l    #$8000,A1
  248.     lea    .moveff(pc),A2
  249.     move.l    #12,D0
  250.     JSRGEN    HexSearch
  251.     cmp.l    #0,A0
  252.     beq.b    .notlev4
  253.     PATCHUSRJSR    (A0),MoveFFA1
  254.     move.w    #$601C,(6,A0)
  255.     JSRGEN    FlushCachesHard
  256. .notlev4
  257.     RESTORE_REGS
  258.     rts
  259.  
  260. .decrunched_len:
  261.     dc.l    0
  262. .moveff:
  263.     dc.w    $12F9
  264.     dc.l    -1
  265.     dc.w    $12F9
  266.     dc.l    -1
  267.  
  268. ; replaces original buggy code: move.b  ($FFFFFFFF),(A1)+ -> access fault
  269.  
  270. MoveFFA1:
  271.     move.b    #$FF,(A1)+
  272.     move.b    #$FF,(A1)+
  273.     move.b    #$FF,(A1)+
  274.     move.b    #$FF,(A1)+
  275.     move.b    #$FF,(A1)+
  276.     move.b    #$FF,(A1)+
  277.     rts
  278.  
  279. AgaErr:
  280.     Mac_printf    "** You need a A1200/A4000 to run SlamTilt!"
  281.     JMPABS        CloseAll
  282.  
  283. OriginalLock:
  284.     dc.l    0
  285. OriginalRunCommand:
  286.     dc.l    0
  287. DOSP:
  288.     dc.l    0
  289. DOSNAM:
  290.     dc.b    "dos.library",0
  291. linefeed:
  292.     dc.b    10
  293.     even
  294. hdname:
  295.     dc.b    "PROGDIR:HD",0
  296. volname:
  297.     dc.b    "Slam1:",0
  298. dfxname:
  299.     dc.b    "dfx:",0
  300. MAINFILE:
  301.     dc.b    "game.exe",0
  302.  
  303.  
  304.  
  305.